//
// Created by hugan on 2020/11/16.
//

#ifndef HUP_UTILS_PARENT_CPP_VOLUMEUTIL_H
#define HUP_UTILS_PARENT_CPP_VOLUMEUTIL_H

#include <iostream>
#include <cmath>
#include <mmdeviceapi.h>
#include <endpointvolume.h>
#include <audioclient.h>

/**
 * 系统音量工具类,查询和设置系统级别的音量状态;
 * .目前使用IAudioEndpointVolume实现功能
 * .最省代码的方案:使用激活虚拟按键[VK_VOLUME_MUTE,VK_VOLUME_UP,VK_VOLUME_DOWN]:有界面提示,但不能指定true/false和音量值;
 *
 * 方案列举:
 * .发送按键消息,最简单的代码,但会使360弹窗提示[模拟按键警告],不推荐,如:VB脚本
 * .IAudioEndpointVolume,调用复杂,且涉及对象的生命周期管理[创建,释放]
 * .应用第三方库
 *
 * 资料:
 * IAudioEndpointVolume 音量控制接口
 * https://docs.microsoft.com/en-us/windows/win32/api/endpointvolume/nn-endpointvolume-iaudioendpointvolume
 * 实例
 * IAudioEndpointVolume
 * https://blog.csdn.net/xym352860763/article/details/103489399
 * 控制Windows系统音量:多中方案
 * https://www.cnblogs.com/tmywu/archive/2013/03/18/2965585.html
 */
class VolumeUtil {
private:
    IMMDeviceEnumerator *pDeviceEnumerator = nullptr;
    IMMDevice *pDevice = nullptr;
    IAudioEndpointVolume *pAudioEndpointVolume = nullptr;
    IAudioClient *pAudioClient = nullptr;

public:
    VolumeUtil();

    ~VolumeUtil();

    void release();

    /**
     * 查询系统是否静音
     */
    bool isMute();

    /**
     * 设置系统静音状态
     * @note 系统不会弹出音量提示图案
     */
    void setMute(bool v);

    /**
     * 获取系统音量
     * @return 范围[0,100]
     */
    int getVolume();

    /**
     * 设置系统音量,会解除静音状态
     * @param v 范围[0,100],超出范围时会自动靠拢
     * @note 系统不会弹出音量提示图案
     * @return 被设置的音量
     */
    int setVolume(int v);
};

#endif //HUP_UTILS_PARENT_CPP_VOLUMEUTIL_H
